//***************************************************************************//
//*
//* 内容摘要：跨平台队列实现，用于构建空满包双队列
//*	
//* 当前版本：V1.0		
//* 作    者：zhfayuan
//* 完成日期：2015-12-26
//**************************************************************************//
#ifndef _SDQUEUE__
#define _SDQUEUE__

#ifdef WIN32
#include <queue>
#include <windows.h>
#else
#include <queue>
#include <pthread.h>
#include <semaphore.h>
#define INFINITE              0xFFFFFFFF  /* Infinite timeout */
#endif
using namespace std;

//队列类型定义
typedef struct
{
    deque<void *> *Array;        // 队列数据
    int iMaxSize;   // 数目最大值
#ifdef WIN32
    HANDLE hLock;
    HANDLE hReadSem;
	HANDLE hWriteSem;
#else
	pthread_mutex_t hLock;
	sem_t hReadSem;
	sem_t hWriteSem;
#endif
    bool bBlock; // 队列是否阻塞
	int nDelayPacketsFirst; //初始缓存大小，必须达到此缓存数方能对外输出
}T_Que, *QueId;

/**************************************************************************
* 函数名称：CreateQueue
* 功能描述：创建队列，队列元素为unsigned char*指针
* 输入参数：uiPackNumber    队列中包的总数
* 输入参数：bBlock      是否是阻塞队列
* 返 回 值：ptQueId     创建的队列指针，可以提供后续调用
                          
* 其它说明：
* 修改日期     
* -----------------------------------------------
* 2013-12-26	     V1.0	    zhfayuan      
**************************************************************************/
QueId CreateQueue(int iPackNumber, bool bBlock = true, int nDelayPacketsFirst = 0);

/**************************************************************************
* 函数名称：DeleteQueue
* 功能描述：删除队列
* 输入参数：pptQueId 队列句柄的指针
* 输出参数：无 
* 返 回 值：0,正常
*			1,异常                         
* 其它说明： 
* 修改日期     
* -----------------------------------------------
* 2013-12-26	     V1.0	    zhfayuan      
**************************************************************************/
int DeleteQueue(QueId *pptQueId);

/**************************************************************************
* 函数名称：PushQueue
* 功能描述：向队列放入元素
* 输入参数：ptQueId 队列句柄
*			pvPack 需要放入的队列元素
* 输出参数：无 
* 返 回 值：                       
* 其它说明： 
* 修改日期     
* -----------------------------------------------
* 2013-12-26	     V1.0	    zhfayuan      
**************************************************************************/ 
void PushQueue(QueId ptQueId, unsigned char* pucPack); 


/**************************************************************************
* 函数名称：PopQueue
* 功能描述：从队列取出元素
* 输入参数：ptQueId 队列句柄
* 输出参数：无 
* 返 回 值：队列元素                         
* 其它说明： 
* 修改日期     
* -----------------------------------------------
* 2013-12-26	     V1.0	    zhfayuan      
**************************************************************************/ 
unsigned char* PopQueue(QueId ptQueId, UINT unWaitTime = INFINITE);


/**************************************************************************
* 函数名称：PopQueue
* 功能描述：从队列获得第一个元素，但不取出
* 输入参数：ptQueId 队列句柄
* 输出参数：无
* 返 回 值：队列元素，若不存在则返回NULL
* 其它说明：
* 修改日期
* -----------------------------------------------
* 2012-12-26	     V1.0	    zhfayuan
**************************************************************************/
unsigned char* FrontQueue(QueId ptQueId);


/**************************************************************************
* 函数名称：IsQueueEmpty
* 功能描述：判断队列是否为空
* 输入参数：ptQueId 队列句柄
* 输出参数：无 
* 返 回 值：bIsEmpty布尔类型，Ture为空，False为非空                         
* 其它说明： 
* 修改日期     
* -----------------------------------------------
* 2013-12-26	     V1.0	    zhfayuan      
**************************************************************************/
bool IsQueueEmpty(QueId ptQueId);


unsigned int CurrentSize(QueId ptQueId);

//设置初始缓存大小，队列中的包数达到此大小时方能开始输出
void SetInitQueueSize(QueId ptQueId, int nInitQueueSize);
#endif // _SDQUEUE__
